<html lang="en-US">

<head>
    
<title>Prometheus 快速入门 - 花落雨忧</title>

<meta property="og:title" content="Prometheus 快速入门 - 花落雨忧">



    



    
    <meta property="description" content="一般我们说 Prometheus，有两种理解，我们平时需要注意识别的，其含义有两种，一是指的 Prometheus 自身，是一个时序数据库；另外一种是指 Prometheus 生态圈，指的是是整体的监控报警的生态圈和解决方案（Prometheus&#43;Grafana&#43;Alertmanager）。
Prometheus 在 2016年加入了 CNCF（Cloud Native Computing &amp;hellip;">
    <meta property="og:description" content="一般我们说 Prometheus，有两种理解，我们平时需要注意识别的，其含义有两种，一是指的 Prometheus 自身，是一个时序数据库；另外一种是指 Prometheus 生态圈，指的是是整体的监控报警的生态圈和解决方案（Prometheus&#43;Grafana&#43;Alertmanager）。
Prometheus 在 2016年加入了 CNCF（Cloud Native Computing &amp;hellip;">
    






<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1">

<link rel="shortcut icon" href="https://www.lican.asia/logo/logo.png" type="image/x-icon" />



<link rel="stylesheet" href="/css/style.min.css" />

<link rel="stylesheet" href="/css/reset.min.css" />




<script src="https://www.lican.asia/js/highlight.min.js"></script>

<script>
hljs.configure({ ignoreUnescapedHTML: true })
hljs.highlightAll();
</script>


<script src="https://www.lican.asia/js/jquery.min.js"></script>




<link href="https://www.lican.asia/css/hugo-code.min.css" rel="stylesheet" />



    <style>
        .post-content img {
            max-width: 400px;
        }
    </style>
</head>

<body id="period" class="home blog">
    <a class="skip-content" href="#main">Press "Enter" to skip to content</a>
    <div id="overflow-container" class="overflow-container">
        <header class="site-header" id="site-header" role="banner">
    <div class="max-width">
        <div id="title-container" class="title-container">
            <div id="site-title" class="site-title"><a href="/">花落雨忧</a></div>
            <p class="tagline">思所及 力所行 方为真.</p>
        </div>
        
        <div id="menu-primary-container" class="menu-primary-container">
            <div class="icon-container">
            </div>
            <div id="menu-primary" class="menu-container menu-primary" role="navigation">
                <nav class="menu">
                    <ul id="menu-primary-items" class="menu-primary-items">
                        
                        
                        <li id="menu-item-0"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/posts" aria-current="page" tabindex="0">首页</a></li>
                        
                        <li id="menu-item-1"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/tech/" aria-current="page" tabindex="1">技术文档</a></li>
                        
                        <li id="menu-item-2"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/article/" aria-current="page" tabindex="2">文章</a></li>
                        
                        <li id="menu-item-3"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/project/" aria-current="page" tabindex="3">项目</a></li>
                        
                        <li id="menu-item-4"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/about/" aria-current="page" tabindex="4">关于</a></li>
                        
                    </ul>
                </nav>
            </div>
        </div>
    </div>
</header>

        <div id="primary-container" class="primary-container">
            <div class="max-width">
                <section id="main" class="main" role="main">
                    <div id="loop-container" class="loop-container">
                        <div
                            class="post type-post status-publish format-standard hentry entry">
                            <article>
                                <div class="post-container">
                                    <div class="post-header">
                                        <h2 class="post-title">
                                            <a href="/posts/posts/prometheus/2020-05-16-startup/">Prometheus 快速入门</a>
                                        </h2>
                                        
                                        <div class="post-byline">Published on
                                            <a class="date" href="javascript:;">2020/05/16</a>
                                            
                                            
                                            
                                            
                                            
                                        
                                    </div>
                                    <div class="post-content">
                                        <p>一般我们说 Prometheus，有两种理解，我们平时需要注意识别的，其含义有两种，一是指的 Prometheus 自身，是一个时序数据库；另外一种是指 Prometheus 生态圈，指的是是整体的监控报警的生态圈和解决方案（Prometheus+Grafana+Alertmanager）。</p>
<p>Prometheus 在 2016年加入了 CNCF（Cloud Native Computing Foundation），是继 Kubernetes 之后的第二个托管项目，目前已经毕业，其主要的特点如下：</p>
<ul>
<li>多维度的数据模型：由指标名称和键/值对标签标识的时间序列数据来组成多维的数据模型。</li>
<li>灵活的查询语言：在 Prometheus 中使用强大的查询语言 PromSQL 来进行查询。</li>
<li>不依赖分布式存储，Prometheus 单个节点也可以直接工作，支持本地存储（TSDB）和远程存储的模式。</li>
<li>服务端采集数据：Prometheus 基于 HTTP pull 方式去对不同的端采集时间序列数据。</li>
<li>客户端主动推送：支持通过 PushGateway 组件主动推送时间序列数据。</li>
</ul>
<h2 id="prometheus-生态组件">Prometheus 生态组件</h2>
<p>Prometheus 生态由多个组件共同组成，其中许多组件是可根据实际情况选择的，并且绝大部分由 Go 语言编写，在部署和构建上比较方便，如下：</p>
<ul>
<li>Prometheus Server：<a href="https://github.com/prometheus/prometheus">Prometheus 服务端</a>，用于收集指标和存储时间序列数据，并提供一系列的查询和设置接口。</li>
<li>Client Libraries：<a href="https://prometheus.io/docs/instrumenting/clientlibs/">客户端库</a>，用于帮助需要监控采集的服务暴露 metrics handler 给 Prometheus server。例如像 <a href="https://github.com/prometheus/client_golang/blob/master/examples/simple/main.go">例子</a> 中直接调用 promhttp 暴露了一个 metrics 接口。</li>
<li>Push Gateway：推送网关，Prometheus 服务端仅支持 HTTP pull 的采集方式，而有一些指存在的时间短，Prometheus 来 pull 前就结束了。又或是该类指标，就是要客户端自行上报的，这时候就可以采用 Push Gateway 的方式，客户端将指标 push 到 Push Gateway，再由 Prometheus Server 从 Pushgateway 上 pull。</li>
<li>Exporters：用于暴露已有的第三方服务（HAProxy，StatsD，Graphite）的 metrics 给 Prometheus Server。</li>
<li>Alertmanager：用于处理告警，从 Prometheus server 端接收到 alerts 后，会进行去重，分组，然后路由到对应的Receiver，发出报警。</li>
<li>Support Tools：各种支持工具。</li>
</ul>
<h2 id="prometheus-整体流程图">Prometheus 整体流程图</h2>
<p>Prometheus 的整体架构和生态组件组成，如下图所示：</p>
<p><img src="https://prometheus.io/assets/architecture.png" alt="image"></p>
<p>Prometheus Server 通过从监控目标中或者间接通过推送网关来拉取监控指标，它在本地存储所有抓取到的样本数据，并对此数据执行一系列规则，以汇总和记录现有数据的新时间序列或生成告警。可以通过 Grafana 或者其他工具来实现监控数据的可视化。</p>
<h2 id="prometheus-采集的数据存到哪里">Prometheus 采集的数据存到哪里</h2>
<p>Prometheus 所有采集的指标数据在默认的情况下，都保存在本地所内置的时间序列数据库（TSDB）当中，如果需要另外调整，再将 Prometheus 的存储指向改为远程存储即可。</p>
<p>Prometheus 采用在默认情况下使用本地存储，能够一定的便利性，例如：开箱即用、运维方便（不用管）等等。但是也有不少缺点，像是海量数据无法持久化等等问题，因此强烈建议在上到企业级的海量应用时，一定对其进行研讨，适当考虑远程存储。</p>
<h3 id="时序数据库是什么">时序数据库是什么</h3>
<p>Prometheus 是时序数据库（Time Series Database），又简称 TSDB。目前在行业中比较出名，流行度较高的时序数据库如下：</p>
<p><img src="https://image.eddycjy.com/899042452628900ef32fe11f8d7a4b1e.jpg" alt="image"></p>
<p>时序数据库简单来讲，就是将数据按照时间顺序排列，它具有唯一性和可排序性，因此在 Prometheus 的 Metrics 中即使只添加了一个新标签，也会造成破坏，也就是它不再是原本的那个时序数据了。</p>
<p>注：时序数据库是一个比较大的话题，后续会单独开一篇文章讲解，此处仅概要。</p>
<h3 id="prometheus-远程存储的方案">Prometheus 远程存储的方案</h3>
<ul>
<li>AppOptics: write</li>
<li>Azure Data Explorer: read and write</li>
<li>Chronix: write</li>
<li>Cortex: read and write</li>
<li>CrateDB: read and write</li>
<li>Elasticsearch: write</li>
<li>Gnocchi: write</li>
<li>Graphite: write</li>
<li>InfluxDB: read and write</li>
<li>IRONdb: read and write</li>
<li>Kafka: write</li>
<li>M3DB: read and write</li>
<li>OpenTSDB: write</li>
<li>PostgreSQL/TimescaleDB: read and write</li>
<li>QuasarDB: read and write</li>
<li>SignalFx: write</li>
<li>Splunk: read and write</li>
<li>TiKV: read and write</li>
<li>Thanos: write</li>
<li>VictoriaMetrics: write</li>
<li>Wavefront: write</li>
</ul>
<h3 id="数据持久化的意义">数据持久化的意义</h3>
<ul>
<li>数据存储与服务提供应当隔离。</li>
<li>事故、问题的度量指标回溯。</li>
<li>数据挖掘的考虑。</li>
<li>提供给外部的自定义平台进行数据查询等等</li>
<li>&hellip;</li>
</ul>
<h2 id="安装-prometheus">安装 Prometheus</h2>
<p><a href="https://github.com/prometheus/prometheus">Prometheus</a> 是由 Go 语言编写的，因此安装非常的方便，只需要在 <a href="https://prometheus.io/download/">DOWNLOAD</a> 中下载对应的 tar.gz 文件。进行如下解压：</p>
<pre tabindex="0"><code>$ tar xvfz prometheus-*.tar.gz
</code></pre><p>就可以看到下述目录：</p>
<pre tabindex="0"><code>prometheus
├── LICENSE
├── NOTICE
├── console_libraries
├── consoles
├── data
├── prometheus
├── prometheus.yml
├── prometheus.yml.default
├── promtool
├── rules
└── tsdb
</code></pre><p>启动 Prometheus：</p>
<pre tabindex="0"><code>$ ./prometheus 
...
level=info ts=2020-05-16T07:33:34.138Z caller=main.go:661 msg=&#34;Starting TSDB ...&#34;
level=info ts=2020-05-16T07:33:34.139Z caller=web.go:508 component=web msg=&#34;Start listening for connections&#34; address=0.0.0.0:9090
</code></pre><p>默认监听 9090 端口：</p>
<p><img src="https://image.eddycjy.com/f39b6b6f1c195973285d2bfd690425f3.jpg" alt="image"></p>
<p>至此我们就完成了 Prometheus 的基本启动了。</p>
<h2 id="小结">小结</h2>
<p>在本章节中，我们快速了解 Prometheus 的基本概念和整体的生态概要，在下一章节起我们将进一步的实操，知行合一。</p>
<h2 id="参考资料">参考资料</h2>
<ul>
<li><a href="https://ryanyang.gitbook.io/prometheus/di-yi-zhang-jie-shao/overview">https://ryanyang.gitbook.io/prometheus/di-yi-zhang-jie-shao/overview</a></li>
<li><a href="https://www.cnblogs.com/xiangsikai/p/11288632.html">https://www.cnblogs.com/xiangsikai/p/11288632.html</a></li>
<li><a href="https://www.cnblogs.com/charlieroro/p/8670959.html">https://www.cnblogs.com/charlieroro/p/8670959.html</a></li>
</ul>


                                        
                                        
                                        
                                        
                                    </div>

                                    
                                    
                                    

                                    
                                    <div class="post-meta">
                                        
                                        
                                        <div class="post-tags">
                                            <ul>
                                            
                                            <li>
                                                <a href="/tags/prometheus" title="View all posts tagged match">prometheus</a>
                                            </li>
                                            
                                            </ul>
                                        </div>
                                        
                                        
                                        <nav class="further-reading">
                                            
                                            <div class="previous">
                                                <span>&lt;&lt; Prev</span>
                                                <a href="https://www.lican.asia/posts/posts/kubernetes/2020-05-10-api/"
                                                    rel="prev">使用 Go 程序调用 Kubernetes API</a> </div>
                                            
                                            
                                            <div class="next">
                                                <span>Next >></span>
                                                <a href="https://www.lican.asia/posts/posts/prometheus/2020-05-16-metrics/">Prometheus 四大度量指标的了解和应用</a> 
                                            </div>
                                            
                                        </nav>
                                    </div>
                                    
                                    

                                    
                                    
                                    

                                </div>
                            </article>
                        </div>
                    </div>
                </section>
                <aside class="sidebar sidebar-primary" id="sidebar-primary" role="complementary">
    <h1 class="screen-reader-text">Sidebar</h1>
    

    
    
    <section id="text-2" class="widget widget_text">
        <div class="textwidget">
            
            <div id="profile">
                <div id="profile_picture"><img src="https://www.lican.asia/logo/logo.png"></div>
                <div id="profile_intro">
                    <p><span class="name">Lican</span></p>
                    <p class="intro">全栈开发者，爱好造轮子。</p>
                </div>
            </div>
            
            <p>
                <script type="text/javascript">
                    (function ($) {
                        $(document).ready(function () {
                            var menuPrimaryContainer = $('#menu-primary-container');
                            var profile = $('#text-2');
                            $('#toggle-navigation').click(function () {
                                if (menuPrimaryContainer.hasClass('open')) {
                                    profile.removeClass('open');
                                } else {
                                    profile.addClass('open');
                                }
                            });
                        });
                    })(jQuery);
                </script>
            </p>
        </div>
    </section>
    
    
    
    
    
    <section id="text-5" class="widget widget_text">
        <h2 class="widget-title">开源项目</h2>
        <div class="textwidget">
            <div id="projects" style="line-height: 22px;">
                
                <a href="https://github.com/idoubi/gonews"
                    target="_blank">gonews</a>: &nbsp;Daily news for golang<br>
                
                <a href="https://github.com/idoubi/sql2struct"
                    target="_blank">sql2struct</a>: &nbsp;Generate go struct according to SQL<br>
                
                <a href="https://github.com/idoubi/goz"
                    target="_blank">goz</a>: &nbsp;Request library used in golang<br>
                
        </div>
    </section>
    
    

    
    
    
    
    <section id="qrcode" class="widget widget_media_image">
        <h2 class="widget-title">微信公众号</h2>
        <img width="258" height="258"
            src="https://www.lican.asia/wechat/lican.png"
            class="image wp-image-5514  attachment-full size-full" alt=""
            style="max-width: 100%; height: auto;"
            sizes="(max-width: 258px) 100vw, 258px">
    </section>
    
    

    
    
    

    
    
    

    
    
    
    
</aside>
            </div>
        </div>

        <footer id="site-footer" class="site-footer" role="contentinfo">
    <div class="max-width">
    </div>
    <div class="footer">
        <div id="footercontent">
            © lican.asia All rights reserved<br/>
            Built with Hugo Theme <a href="https://github.com/idoubi/hugo-theme-period" target="_blank">Period</a>
        </div>
    </div>
</footer>

<script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?e8351b6d4626d5881d439ea1f6184baa";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
</script>
    
    
    </div>
    
</body>

</html>